package base.entity;

import java.util.Objects;

/**
 * 已打开文件表的类
 * @Author: x1aolone
 * @Date: 2019/9/26 21:22
 */
public class OpenedFile {

    public OpenedFile(String name, byte property, byte beginFatNum, int length, byte operationType, byte read_dnum, byte read_bnum, byte write_dnum, byte write_bnum) {
        this.name = name;
        this.property = property;
        this.beginFatNum = beginFatNum;
        this.length = length;
        this.operationType = operationType;
        this.read_dnum = read_dnum;
        this.read_bnum = read_bnum;
        this.write_dnum = write_dnum;
        this.write_bnum = write_bnum;
    }

    /**
     * 文件名绝对路径名
     */
    private String name;

    /**
     * 文件的属性
     * 第7位  第6位  第5位  第4位   第3位   第2位    第1位   第0位
     * 未使用 未使用 未使用 未使用 目录属性 普通文件 系统文件 只读文件
     * 该字节为 3（00000011），表示该目录是一个只读系统文件的登记项
     * 该字节为 4（000000100），表示该目录是一个可读可写的普通文件
     */
    private Byte property;

    /**
     * 文件的起始盘块号
     */
    private Byte beginFatNum;

    /**
     * 文件长度，文件占用的字节数，与FileItem中的length（单位为盘块，64字节）不同
     */
    private Integer length;

    /**
     * 操作类型
     * -1表示未知，打开而已
     * 0表示用读操作方式打开文件
     * 1表示用写操作方式打开文件
     */
    private Byte operationType;

    /**
     * 读文件的位置
     * dnum为磁盘盘块号(0~127)
     * bnum为磁盘盘块内第几个字节
     * 文件打开时dnum为文件起始盘块号，bnum为0
     */
    private Byte read_dnum;

    private Byte read_bnum;
    /**
     * 写文件的位置
     * dnum为磁盘盘块号
     * bnum为磁盘盘块内第几个字节(0~127)
     * 文件刚建立时dnum为文件起始盘块号，bnum为0
     * 文件打开时dnum和bnum为文件的末尾位置
     */
    private Byte write_dnum;

    private Byte write_bnum;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Byte getProperty() {
        return property;
    }

    public void setProperty(Byte property) {
        this.property = property;
    }

    public Byte getBeginFatNum() {
        return beginFatNum;
    }

    public void setBeginFatNum(Byte beginFatNum) {
        this.beginFatNum = beginFatNum;
    }

    public Integer getLength() {
        return length;
    }

    public void setLength(Integer length) {
        this.length = length;
    }

    public Byte getOperationType() {
        return operationType;
    }

    public void setOperationType(Byte operationType) {
        this.operationType = operationType;
    }

    public Byte getRead_dnum() {
        return read_dnum;
    }

    public void setRead_dnum(Byte read_dnum) {
        this.read_dnum = read_dnum;
    }

    public Byte getRead_bnum() {
        return read_bnum;
    }

    public void setRead_bnum(Byte read_bnum) {
        this.read_bnum = read_bnum;
    }

    public Byte getWrite_dnum() {
        return write_dnum;
    }

    public void setWrite_dnum(Byte write_dnum) {
        this.write_dnum = write_dnum;
    }

    public Byte getWrite_bnum() {
        return write_bnum;
    }

    public void setWrite_bnum(Byte write_bnum) {
        this.write_bnum = write_bnum;
    }

    @Override
    public String toString() {
        return "OpenedFile{" +
                "name='" + name + '\'' +
                ", property=" + property +
                ", beginFatNum=" + beginFatNum +
                ", length=" + length +
                ", operationType=" + operationType +
                ", read_dnum=" + read_dnum +
                ", read_bnum=" + read_bnum +
                ", write_dnum=" + write_dnum +
                ", write_bnum=" + write_bnum +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        OpenedFile that = (OpenedFile) o;
//        return property == that.property &&
//                beginFatNum == that.beginFatNum &&
//                length == that.length &&
//                operationType == that.operationType &&
//                read_dnum == that.read_dnum &&
//                read_bnum == that.read_bnum &&
//                write_dnum == that.write_dnum &&
//                write_bnum == that.write_bnum &&
//                Objects.equals(name, that.name);
        // 其实盘块号一样说明是同一个文件，同一个文件是不允许同时打开的
        return beginFatNum.equals(that.beginFatNum);
    }

}
